import { LoginInfo, ListFucDoTimeSheetFormWithTask } from '@/api/login'
import { localCache } from "@/plugins/cache"
import { defineStore } from 'pinia';

/**
 * @description InterfaceList 类型定义，用于描述接口列表的结构
 */
export type InterfaceList = {
	[key: string]: {
		[key: string]: any;
	};
};

/**
 * @description UserDto 接口定义，用于描述用户数据传输对象
 */
export interface UserDto {
	userInfo: any,
	permission: any,
	interfaceList?: InterfaceList | undefined
}

/**
 * @description Login 接口定义，用于描述登录请求的数据结构
 */
export interface Login {
	account: string,
	password: string
}

/**
 * @description 定义 Pinia store，用于管理登录状态和用户信息
 */
export const userLoginStore = defineStore({
	id: "login",
	state: (): UserDto => ({
		// 从本地缓存中获取用户信息、权限和接口列表
		userInfo: localCache.get("userInfo"),
		permission: localCache.get("permission"),
		interfaceList: localCache.get("interfaceList")
	}),
	getters: {
		/**
		 * @description 获取用户信息
		 * @returns 用户信息
		 */
		getUserInfo(): any {
			return this.userInfo;
		},

		/**
		 * @description 获取权限信息
		 * @returns 权限信息
		 */
		getPermission(): any {
			return this.permission;
		},

		/**
		 * @description 获取接口列表
		 * @returns 接口列表
		 */
		getInterfaceList(): InterfaceList | undefined {
			return this.interfaceList;
		}
	},
	actions: {
		/**
		 * @description 用户登录
		 * @param data 登录所需的账号和密码
		 * @returns Promise，表示登录过程的完成
		 */
		login(data: Login) {
			return new Promise((resolve, reject) => {
				LoginInfo(data).then(async (_res: any) => {
					// 检查返回的代码是否表示登录失败
					if (_res.data.code === '-1') {
						reject("登录失败");
					}

					// 成功登录，保存用户信息和 token 到本地缓存中
					this.userInfo = _res.data.returnData;
					localCache.set('userInfo', _res.data.returnData);
					localCache.set('token', _res.data.returnData[0]);

					// 获取接口列表并缓存
					const interfaceList = await this.selectInterface();
					localCache.set("interfaceList", interfaceList);
					this.interfaceList = interfaceList;

					resolve("登录成功");
				}).catch((_err: any) => {
					// 处理登录请求失败的情况
					reject("登录失败");
				});
			});
		},

		/**
		 * @description 获取接口列表
		 * @returns Promise，包含接口列表数据
		 */
		async selectInterface() {
			const { data } = await ListFucDoTimeSheetFormWithTask();
			let retMap: InterfaceList = {};
			// 遍历 data 对象，将其转换为 InterfaceList 结构
			for (const k1 in data) {
				const dt = data[k1];
				let r2Map: { [key: string]: any } = {};
				for (const k2 in dt) {
					const d = dt[k2];
					r2Map[k2] = d;
				}
				retMap[dt.keyName] = r2Map;
			}
			return retMap;
		}
	}
});